package paint;

/**
 * La classe Rectangle sert à la création d'un objet Rectangle<br>
 * @author Romain Bustos
 * @author Matthieu Perrin
 * @version 1.0
 */
public class Rectangle extends Forme {
    protected Point P1;        //Position haut gauche
    protected Point P2;        //Position bas droit
    protected boolean Plein;    //type
       
    protected Point Origine;
    
    /**
    *<b>Constructeur par defaut de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé lors d'une construction sans arguements d'un Rectangle <br>
    * P1 = new Point() <br>
    * P2 = new Point() <br>
    * </p>
    */
    public Rectangle() {
        P1 = new Point();
        P2 = new Point();
        Origine = new Point();
        calculOrigine();
    }   
    
    /**
    *<b>Constructeur canonique de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé lors de la construction d'un Rectangle<br>
    * </p>
    */
    public Rectangle(Point X, Point Y){
        P1 = X;
        P2 = Y;
        Origine = new Point();
        Plein = true;
        calculOrigine();
    }
    
    
    /**
    *<b>Methode classe Rectangle</b><br> 
    * <p>
    * Methode servant à calculer l'origine d'une forme Rectangle<br>
    * </p>
    */
    public void calculOrigine()
    {
        if ( P1.getX() < P2.getX())
            Origine.setX(P1.getX());
        else
            Origine.setX(P2.getX());
        
        if ( P1.getY() < P2.getY())
            Origine.setY(P1.getY());
        else
            Origine.setY(P2.getY());
    }
    
    
    /**
    *<b>Constructeur secondaire de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour créer le clone d'un objet Rectangle courant<br>
    * </p>
    * @return Clone d'un rectangle
    */
    @Override
    public Rectangle createClone(){
        return new Rectangle(this.P1, this.P2);
    }
    
    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour recupérer le point P1 du rectangle courant<br>
    * </p>
    * @return P1 courant
    */
    public Point getP1() {
        return P1;
    }

    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour recupérer le point P2 du rectangle courant<br>
    * </p>
    * @return P2 courant
    */
    public Point getP2() {
        return P2;
    }
    
    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour recupérer l'origine du rectangle courant<br>
    * </p>
    * @return origine du rectangle courant
    */
    public Point getOrigine()
    {
        calculOrigine();
        return Origine;
    }
    
    
    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour recupérer lalongueur du rectangle courant<br>
    * </p>
    * @return longueur du rectangle courant
    */
    public int getLong(){
        return Math.abs(this.P1.getY() - this.P2.getY()); 
    }
    
    
    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour recupérer la largeur du rectangle courant<br>
    * </p>
    * @return largeur du rectangle courant
    */
    public int getLarg(){
        return Math.abs(this.P1.getX() - this.P2.getX()); 
    }
   
    /**
    *<b>Mutateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour modifier la valeur P1<br>
    * </p>
    * @param X
    *       nouvelle valeur P1
    */
    public void setP1(Point X) {
        this.P1 = X;
    }

    /**
    *<b>Mutateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour modifier la valeur P2<br>
    * </p>
    * @param Y
    *       nouvelle valeur P2
    */
    public void setP2(Point Y) {
        this.P2 = Y;
    }
    
    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour savoir si deux objet de type Rectangle sont égaux<br>
    * </p>
    * @param R1
    *       Rectangle de comparaison
    * @return boolean => Vrai / Faux
    */
    public boolean equals(Rectangle R1){
        return (this.P1.equals(R1.P1) && this.P2.equals(R1.P2));
    }
    
    /**
    *<b>Observateur de la classe Rectangle</b><br> 
    * <p>
    * Est utilisé pour donner un aperçu d'un rectangle sous forme de texte<br>
    * </p>
    * @return détail d'un rectangle
    */
    @Override
    public String toString(){
        return "Point A: " + this.P1 + " Point B: " + this.P2;
    }
}

